package com.applet.message.problem.service.impl;

import java.util.List;

import com.applet.common.utils.DateUtils;
import com.applet.common.utils.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.Instant;
import java.util.Random;

import com.applet.common.utils.StringUtils;
import org.springframework.transaction.annotation.Transactional;
import com.applet.message.problem.domain.ProblemImage;
import com.applet.message.problem.mapper.ProblemMapper;
import com.applet.message.problem.domain.Problem;
import com.applet.message.problem.service.IProblemService;

/**
 * 问题反馈处理Service业务层处理
 *
 * @author ruoyi
 * @date 2024-09-26
 */
@Service
public class ProblemServiceImpl implements IProblemService {
    @Autowired
    private ProblemMapper problemMapper;

    /**
     * 查询问题反馈处理
     *
     * @param id 问题反馈处理主键
     * @return 问题反馈处理
     */
    @Override
    public Problem selectProblemById(Long id) {
        return problemMapper.selectProblemById(id);
    }

    /**
     * 客户端查询问题反馈处理列表
     *
     * @param problem 问题反馈处理
     * @return 问题反馈处理
     */
    @Override
    public List<Problem> selectUserProblemList(Problem problem) {
        //获取当前用户id,用于查询当前用户的问题反馈数据
        problem.setUserId(SecurityUtils.getUserId());
        return problemMapper.selectProblemList(problem);
    }

    /**
     * 查询问题反馈处理列表
     *
     * @param problem 问题反馈处理
     * @return 问题反馈处理
     */
    @Override
    public List<Problem> selectProblemList(Problem problem) {
        return problemMapper.selectProblemList(problem);
    }

    /**
     * 新增问题反馈处理
     *
     * @param problem 问题反馈处理
     * @return 结果
     */
    @Transactional
    @Override
    public int insertProblem(Problem problem) {
        problem.setCreateTime(DateUtils.getNowDate());
        problem.setUserId(SecurityUtils.getUserId());
        problem.setProcessStatus(0);
        // 获取当前时间戳（精确到毫秒）
        long timestamp = Instant.now().toEpochMilli();
        // 生成一个4位的随机数
        int randomNum = new Random().nextInt(10000);
        // 进行格式化，%为格式化开始字符，16表示第一个参数长度为16，不足则用0代替，生成初步的编号（20位，其中后4位为随机数）
        String questionId = String.format("%016d%04d", timestamp, randomNum);
        problem.setQuestionNumber(questionId);
        int rows = problemMapper.insertProblem(problem);
        if (!problem.getProblemImageList().isEmpty() && rows > 0) {
            insertProblemImage(problem);
        }
        return rows;
    }

    /**
     * 修改问题反馈处理
     *
     * @param problem 问题反馈处理
     * @return 结果
     */
    @Transactional
    @Override
    public int updateProblem(Problem problem) {
        problem.setUpdateTime(DateUtils.getNowDate());
//        problemMapper.deleteProblemImageByProblemId(problem.getId());
//        insertProblemImage(problem);
        if(!problem.getReplyText().isEmpty()){
            problem.setProcessUserId(SecurityUtils.getUserId());
            problem.setProcessStatus(1);
            problem.setUpdateTime(DateUtils.getNowDate());
            return problemMapper.updateProblem(problem);
        }
        else {
            return 0;
        }
    }

    /**
     * 批量删除问题反馈处理
     *
     * @param ids 需要删除的问题反馈处理主键
     * @return 结果
     */
    @Transactional
    @Override
    public int deleteProblemByIds(Long[] ids) {
        problemMapper.deleteProblemImageByProblemIds(ids);
        return problemMapper.deleteProblemByIds(ids);
    }

    /**
     * 删除问题反馈处理信息
     *
     * @param id 问题反馈处理主键
     * @return 结果
     */
    @Transactional
    @Override
    public int deleteProblemById(Long id) {
        problemMapper.deleteProblemImageByProblemId(id);
        return problemMapper.deleteProblemById(id);
    }

    /**
     * 新增问题反馈的图片路径关联信息
     *
     * @param problem 问题反馈处理对象
     */
    public void insertProblemImage(Problem problem) {
        List<ProblemImage> problemImageList = problem.getProblemImageList();
        Long id = problem.getId();
        if (StringUtils.isNotNull(problemImageList)) {
            problemImageList.forEach(problemImage -> problemImage.setProblemId(id));
            problemMapper.batchProblemImage(problemImageList);
        }
    }
}
